package main //建议包名与文件夹同名，main一般是程序的入口包,一般main函数都会放在这个包下
import (
	"fmt"
	"errors"
)


//go中追求优雅，引入defer+recover处理错误
func main(){
	test1()
    err := test2()
	if err != nil {
		fmt.Println("自定义错误：",err)
		
		panic(err)//终止程序
	}
	fmt.Println("上面逻辑执行成功。。。")
	fmt.Println("正常执行下边逻辑。。。")
}

//利用defer+recover来捕获错误
func test1(){
	defer func(){
		//调用recover内置函数，可以捕获错误
		err := recover()
		//如果没有捕获错误，返回值为0：nil
		if err != nil {
			fmt.Println("错误已捕获")
		}
		fmt.Println("err是",err)
	}()
	num1 := 10
	num2 := 5
	result := num1 / num2 //报错 panic：恐慌 除数为0
	fmt.Println(result)
	fmt.Println("test1执行结束---------------\n")
}

//自定义错误：需要调用errors包下的New函数，返回一个error类型
func test2()(err error){
	num1 := 10
	num2 := 0

	if(num2 == 0){
		return errors.New("除数不能为0") 
	}else{
	   result := num1 / num2 //报错 panic：恐慌 除数为0
	   fmt.Println(result)
	   return nil //nil 零的意思
	}
}